using Digitalmes.Domain.Entities.Mes.Productions;

namespace Digitalmes.Application.Providers;

/// <summary>
/// 数据同步提供者。
/// </summary>
internal sealed class RemoteSynchronousProvider(IRepository<ProdStepExecution> stepExecutionRepo) : IRemoteSynchronousProvider
{
    /// <summary>
    /// 数据同步方式，如 MQ、HTTP、Table、RPC 等
    /// </summary>
    public string? SyncMethod { get; } = "HTTP";

    public async Task<(bool ok, string? error)> PushAsync(long executionId, RemoteSyncModeEnum syncMode, CancellationToken cancellationToken = default)
    {
        try
        {
            // 根据工艺步骤执行记录Id找到对应的过程数据、出站数据和绑定的物料（按需求）
            // 对检索的数据进行整理，并推送到远端
            var stepExecution = await stepExecutionRepo.GetByIdAsync(executionId, cancellationToken);
            if (stepExecution == null)
            {
                return (false, "Not Found");
            }

            // 其中，若 SyncMode 为 "Completed" 时，此数据为完工下线，所有生产数据打包一次性推送

            if (syncMode is RemoteSyncModeEnum.Completed)
            {
                // 检查产品是否有下线
                await stepExecutionRepo.GetListAsync(m => m.Sn == stepExecution.Sn && m.RoutingId == stepExecution.RoutingId, cancellationToken);
            }

            // 设置推送超时时长
            CancellationTokenSource timeoutCts = new(TimeSpan.FromSeconds(10)); // 设置超时时长
            using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(timeoutCts.Token, cancellationToken);

            // 推送数据（根据实际情况做对应处理）

            return (true, default);
        }
        catch (OperationCanceledException)
        {
            return (false, "Canceled");
        }
        catch (Exception ex)
        {
            int len = Math.Min(ex.Message.Length, 128);
            return (false, ex.Message[..len]);
        }
    }
}
